<?php
class CSyncFile {
	public $file_name;
	/**
	 * File id
	 *
	 * @var string
	 */
	public $id;

	/**
	 * clone folders name (mount by nfs)
	 * note: folder names include slash character
	 *
	 * @var array
	 */
	public static $images = null;
	public static $baseFolder = null;

	/**
	 * Return array of folder names
	 *
	 * @return array
	 */
	public function &getImages() {
		if (null==self::$images) {
			if (!(self::$images = @$GLOBALS['sync_files']) || empty(self::$images)) {
				self::$images = array(ROOT_DIR);
			}
		}
		return self::$images;
	}

	/**
	 * Get base folder
	 */
	public function getBaseFolder() {
		if (null==self::$baseFolder) {
			$this->getImages();
			self::$baseFolder = self::$images[0];
		}
		return self::$baseFolder;
	}

	/**
   * Hàm khởi tạo
   * @param string $file_name Tên file
   * @see CFile::$file_name
   */
	function __construct($file_name) {
		$this->file_name = $file_name;
	}

	/**
	 * Enter description here...
	 *
	 */
	function &close() {
		try {
			if($this->id) {
				fclose($this->id);
				$this->id = false;
			}
		} catch(Exception $e) {
		}
	}

	/**
   * Hàm mở file
   * @param string $mode Chế độ mở file. "r" là đọc, "w" là ghi, "a" là append, ...
   * @return ref $this Trả lại tham chiếu đến đối tượng cache hiện tại để có thể gọi hàm tiếp    */
	function &open($mode = 'r') {
		try {
			$this->id = fopen($this->getBaseFolder().$this->file_name, $mode);
		}
		catch(Exception $e) {
		}
		return $this;
	}

	/**
   * Hàm đọc nội dung của file
   * @return string Nội dung của file
   */
	function get() {
		try {
			return file_get_contents($this->getBaseFolder().$this->file_name);
		} catch(Exception $e) {
		}
	}

	/**
   * Hàm đưa nội dung vào file
   * @param string $content Nội dung cần ghi
   * @return $this Trả lại tham chiếu đến đối tượng cache hiện tại để có thể gọi hàm tiếp
   */
	function &put($content) {
		//file_put_contents($this->file_name, $content);
		foreach ($this->getImages() as $folder) {
			try {
				file_put_contents($folder.$this->file_name, $content);
			} catch (Exception $e) {
			}
		}
		return $this;
	}

	/**
   * Hàm di chuyển con trỏ file
   * @param int $pos Vị trí cần đến
   * @param int $whence Cách thức di chuyển. Giá trị mặc định là SEEK_SET
   * @return $this Trả lại tham chiếu đến đối tượng cache hiện tại để có thể gọi hàm tiếp
   */
	function &seek($pos, $whence = SEEK_SET) {
		try {
			fseek($this->id, $pos, $whence);
		} catch (Exception $e) {
		}
		return $this;
	}

	/**
   * Hàm kiểm tra xem đã đến cuối file chưa
   * @return bool true nếu đến cuối file, false nếu không
   */
	function eof() {
		try {
			return feof($this->id);
		} catch(Exception $e) {
		}
		return true;
	}

	/**
	 * Xóa file
	 *
	 * @param tên file $filename
	 * @return  bool
	 */
	function remove($filename){
		foreach ($this->getImages() as $folder) {
			try {
				error_log('delete folder file===> '.$folder.$filename."\n<br>", 3, ROOT_DIR.'publish/delfolder.htm');
				@unlink($folder . $filename);
			} catch (Exception $e) {
			}
		}
		return true;
	}

	/**
	 * Delete file and all sync versions
	 *
	 * @return unknown
	 */
	function delete() {
		foreach ($this->getImages() as $folder) {
			try {
				@unlink($folder.$this->file_name);
			} catch (Exception $e) {
			}
		}
		return true;
	}

	/**
	 * Make directory
	 *
	 * @return unknown
	 */
	function mkdir() {
		$dir = explode('/', $this->file_name);
		array_pop($dir);
		$dir = join('/', $dir);
		foreach ($this->getImages() as $folder) {
			try {
				@mkdir($folder.$dir, 0777, true);
			} catch (Exception $e) {}
		}
		return $dir.'/';
	}
/**
	 * Xóa 1 thư mục ảnh giá
	 *
	 * @param int $idProduct các ảnh của giá sản phẩm 
	 * @return no
	 */
	function rmdir($folder_name,$root_path = 'upload/vict/widgets/prices/') {
		$folder = $root_path.$folder_name;
		if (file_exists($folder)){
			//log
			//error_log('delete folder===> '.$folder."\n", 3, ROOT_DIR.'publish/delfolder.txt');
			$files = $this->files($folder);
			foreach ($files as $file) {
				$this->remove($folder.'/'.$file);
			}
			return false;
		}else{
			return false;
		}
	}
	/**
      * Hàm lấy danh sách các file trong thư mục
      * @return mảng Danh sách các file trong thư mục
      */
	function files($folder)
	{
		$files = array();
		$dir = opendir($folder);
		while($file = readdir($dir))
		 {
			if($file != '.' and $file != '..')
			{
				$files[$file] = $file;
			}
		}
		return $files;
	}
	/**
	 * Copy upload file to all sync folders
	 *
	 * @param string $upload_file_name
	 * @param string $file_name
	 */
	function upload($upload_file_name, $file_name) {
		$files = array();
		foreach ($this->getImages() as $folder) {
			$files[] = $folder.$this->file_name.'/'.$file_name;
		}
		move_uploaded_file($upload_file_name, $files[0]);
		for ($i=1, $n=count($files); $i<$n; $i++) {
			@copy($files[0], $files[$i]);
			error_log($files[0].' ===> '.$files[$i]."\n", 3, ROOT_DIR.'publish/sync.txt');
		}
	}

	/**
	 * Sync files from base folder to all folders
	 *
	 * @param array $file_names
	 */
	public function sync_files($file_names) {
		$folders = $this->getImages();
		error_log('sync files: '.var_export($file_names,1)."\n", 3, ROOT_DIR.'publish/sync.txt');
		for($i=1, $n=count($folders); $i<$n; $i++) {
			foreach ($file_names as $file_name) {
				error_log($folders[0].$this->file_name.'/'.$file_name.' ===> '.$folders[$i].$this->file_name.'/'.$file_name."\n", 3, ROOT_DIR.'publish/sync.txt');
				@copy($folders[0].$this->file_name.'/'.$file_name, $folders[$i].$this->file_name.'/'.$file_name);
			}
		}
	}

	/**
	 * Return array of file name (relative from base folders)
	 *
	 * @param unknown_type $file_names
	 * @return unknown
	 */
	public function get_offset_dir($file_names) {
		$folders = $this->getImages();
		$base = $folders[0];
		$l = strlen($base);
		foreach ($file_names as &$file_name) {
			if (substr($file_name, 0, $l)==$base) {
				$file_name = substr($file_name, $l);
			} else {
				var_dump('Kiem tra lai ten file: ', $file_name, $base); exit();
				return $file_name;
			}
		}
		return $file_names;
	}
}
